from django.shortcuts import render
from libs.captcha.captcha import captcha
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from .serializers import RegisterSmsCodeSerializer
from django_redis import get_redis_connection
from . import constants
from django.http import HttpResponse
from random import randint
from rest_framework.response import Response
from libs.yuntongxun.sms import CCP
# Create your views here.


class RegisterImageCodeView(APIView):
    """
    GET    /verifications/imagecodes/(?P<image_code_id>.+)/
    image_code_id  是作为 判断 用户 输入的时候 查询redis的依据
    image_code_id  是js中的UUid 生成的
    """""
    def get(self, request, image_code_id):

        # 1.生成验证码和图片验证码
        text, image = captcha.generate_captcha()

        # 2.保存验证码到redis中
        # 传入setting中的一个redis别名就可以
        # get_redis_connect 只需要输入settings中的 redis别名就可以
        redis_conn = get_redis_connection('code')

        # 设定的有效时间最好以定义在一个文件中的常量表示
        redis_conn.setex('img_%s' % image_code_id, constants.IMAGE_EXPIRE_TIME, text)

        # 3.返回图片
        return HttpResponse(image, content_type='image/jpeg')


class RegisterSmsCodeView(GenericAPIView):
    """
    获取短信验证码
    GET /verifications/smscodes/(?P<mobile>1[345789]\d{9})/?text=xxxx&image_code_id=xxxx
    获取短信验证码,首先需要校验 验证码

    思路:
    创建序列化器,定义text 和 image_code_id
    redis 判断该用户是否频繁获取
    生成短信验证码
    redis增加记录
    发送短信
    返回响应
    """""

    serializer_class = RegisterSmsCodeSerializer

    def get(self, request, mobile):

        # 1.手机号,text,uuid
        params = request.query_params

        # 2.需要对text和uuid进行校验
        serializer = self.get_serializer(data=params)
        serializer.is_valid(raise_exception=True)

        # 3.生成手机短信验证码
        sms_code = '%06d' % randint(0, 999999)

        # 3.1将短信保存到redis中
        redis_conn = get_redis_connection('code')

        # 3.2先判断这个用户这个手机是否直接发过消息
        flag = redis_conn.get('sms_flag_%s' % mobile)
        if flag:
            return Response(status=429)

        redis_conn.setex('sms_%s' % mobile, 60*5, sms_code)

        # 最好添加一个标记判断是否发送过短信
        redis_conn.setex('sms_flag_%s' % mobile, 60, 1)

        # 发送
        # ccp = CCP()
        # ccp.send_template_sms(mobile,[sms_code,5],1)

        from celery_tasks.sms.tasks import send_sms_code

        # 注意点:我们的任务需要通过 delay 调用
        #  delay方法的参数是通过delay传递
        send_sms_code.delay(mobile, sms_code)

        return Response({'message': 'ok'})
